// 导入axios
import axios from 'axios'
// 导入store
import store from '@/store'
// 导入router
import router from '@/router'
// 导入Toast
import { Toast } from 'vant'

// 创建新的axios对象并设置基地址
const request = axios.create({
    // 注意：不能有任何空格，复制时小心点
    baseURL: 'http://geek.itheima.net/'
})

// 添加请求拦截器
request.interceptors.request.use(config => {
    // 有token才加请求头
    if (store.state.tokenObj.token) {
        config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token
    }
    return config

}, err => {

    return Promise.reject(err)
})


// 添加响应拦截器
request.interceptors.response.use(response => {

    // 正常响应会调用的回调函数
    return response.data

}, async error => {

    // 判断错误是不是401错误
    if (error.response.status == 401) {

        try {
            // 代表token有问题，有问题就用refresh_token去问服务器要一个新的token
            const res = await axios({
                url: 'http://geek.itheima.net/v1_0/authorizations',
                method: 'put',
                headers: {
                    Authorization: 'Bearer ' + store.state.tokenObj.refresh_token
                }
            })

            // 把最新的token和原本的refresh_token存到vuex与本地存储
            store.commit('setToken', {
                token: res.data.data.token,
                refresh_token: store.state.tokenObj.refresh_token
            })

            // 这句话实现了无感刷新
            return request(error.config)

        } catch {

            // 证明连refresh_token都过期了，打回登录页
            Toast.fail('登录状态已过期，请重新登录！')
            router.push('/login')
            setTimeout(() => {
                // 清除控制台信息
                console.clear()
            }, 500);
        }
    }
    // 响应出错调用的回调函数
    return Promise.reject(error)
})


// 暴露请求对象出去
export default request